import re
import xlwt
import requests
import bs4

def getHTML(origin_url):  #在所有省份中找到 "黔" 的高校
    try:
        r = requests.get(origin_url, timeout=30)  # 获取网页内容
        r.raise_for_status()  #返回200则内容正确，如果不是的话会抛出HttpError异常
        r.encoding = r.apparent_encoding  # 会从网页的内容分析网页编码格式，比encoding更精确，防止乱码
    except:
        return ""
    soup = bs4.BeautifulSoup(r.text, "html.parser") #解析html，生成标签树
    for x in soup.find_all('a',string='黔'): #找到贵州的那一栏
        return x.get('href') #并获取它的超链接网址

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)  # 获取网页内容
        r.raise_for_status()  # 返回200则内容正确
        r.encoding = r.apparent_encoding  # 设置编码格式
        return r.text  # 以文本形式返回HTML网页
    except:
        return ""

def printAndSave(html):
    soup = bs4.BeautifulSoup(html, "html.parser")
    excel = xlwt.Workbook(encoding='utf-8')
    tables = ['贵州本科高校排名信息', '贵州专科高校排名信息', '贵州独立学院排名信息', '贵州民办高校排名信息']
    i = 0
    for bd_1 in soup.find_all('td',class_='FONT'): #形成一级，bd_1对应表级
        j=0
        sheet = excel.add_sheet(tables[i])  # 新建一个sheet表单，表单名在tables里
        print("\n\n\t\t\t\t\t\t\t{index}".format(index=tables[i]))  # 打印表格名称
        print('%-20s' % ('   '), end='')    #这句是为了在控制台打印第一列的属性名时格式对齐

        bs_1=str(bd_1)
        bs_1=bs_1.split('<br/>')
        for bd_2 in bs_1:                #以<br/>切割，形成二级，bd_2对应学校记录
            bs_2=re.sub("<[^>]*>", "", bd_2)#从<开始,^表示不是，*任意多个，表示保留
            bs_2=bs_2.split()
            for bd_3 in bs_2:            #去除所有标签，并以空格分隔，形成三级，bd_3对应属性
               print('%-20s' % (bd_3), end='')  # end=''表示不换行，‘%-30s’表示左对齐30位，%是连接符

               #下面是写入excel表
               p = int(j / 6)  # 行
               q = int(j % 6)  # 列
               j = j + 1
               if p == 0 and q==0:                       #在（0，0）单元格写空
                   sheet.write(0, 0, " ")
                   p = int(j / 6)
                   q = int(j % 6)
                   j = j + 1
                   sheet.write(p, q, bd_3)
               elif p != 0 and q == 5 and bd_3[0] != 'h':  # 若网址那一栏为空，则跳过并去写下一行的第0列
                    p = int(j / 6)
                    q = int(j % 6)
                    j = j + 1
                    sheet.write(p, q, bd_3)
               else:
                    sheet.write(p, q, bd_3)

            print('') #换行作用
        i=i+1
    excel.save('C:/Users/kakaxiiii/Desktop/贵州高校信息.xls')  # 保存excel文件

def main():
    url = 'http://www.huaue.com/'
    url = getHTML(url)
    html=getHTMLText(url)
    printAndSave(html)

main()

